#include <signal.h>
#include <pthread.h>
#include "tcp_socket.hpp"
#define CHECE_ERS(q) if((q)==false){return -1;}

int new_worker(TcpSocket &conn_sock)
{
  pid_t pid;
  pid=fork();
  if(pid<0)
  {
    perror("pthread error");
    return -1;
  }else if(pid==0)
  {

    while(1)
    {
      //新建连接与客户端通信
     std::string buf;
     bool ret;

      ret=conn_sock.Recv(&buf);
      if(ret==false)
      {
        conn_sock.Close();
        break;
      }
      std::cout<<"client say:"<<buf<<std::endl;
      std::cout<<"serve say:";
      
      
      fflush(stdout);
      std::cin>>buf;

      ret=conn_sock.Send(buf);
      if(ret==false)
      {
        conn_sock.Close();
        break;
      }
    }
    conn_sock.Close();
    exit(-1);

  }
  return 0;
}

int main()
{
  //显示忽略子进程退出，相当于告诉系统子进程退出直接释放资源
  signal(SIGCHLD,SIG_IGN);
  
  TcpSocket list_sock;
  //创建套接字
  CHECE_ERS(list_sock.Socket());
  //绑定地址信息
  CHECE_ERS(list_sock.Bind("192.168.227.143",9000));
  //开始监听
  CHECE_ERS(list_sock.Listen());

  //获取新建链接
  while(1)
  {
    TcpSocket conn_sock;
    std::string cliip;
    std::string cliprot;
    bool ret;
    ret=list_sock.Accept(&conn_sock,&cliip,&cliprot);
    if(ret==false)
    {
      continue;
    }

    std::cout<<"new connection"<<cliip<<":"<<cliprot<<std::endl;
    new_worker(conn_sock);
    //父进程必须关闭套接字，否则连接的客户端越多，创建的套接字越多，但是父进程并不与客户端通信，所以最后会资源耗尽，但是必须关闭，而父子进程数据都有，因此父进程的关闭并不影响子进程
    //父进程必须关闭套接字，否则连接的客户端越多，创建的套接字越多，但是父进程并不与客户端通信，所以最后会资源耗尽，但是必须关闭，而父子进程数据都有，因此父进程的关闭并不影响子进程
    conn_sock.Close();
  }
  //关闭套接字
  list_sock.Close();
  return 0;
}






